package cn.git.agent;

import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.matcher.ElementMatchers;

import java.lang.instrument.Instrumentation;

import static net.bytebuddy.matcher.ElementMatchers.named;

/**
 * @description: mysql的拦截插件
 * @program: bank-credit-sy
 * @author: lixuchun
 * @create: 2024-12-23
 */
public class MySqlAgent {

    /**
     * 拦截方法名称
     */
    public static final String PREPARED_STATEMENT_NAME = "com.mysql.jdbc.PreparedStatement";

    /**
     * premain方法,main方法执行之前进行调用，插桩代码入口
     * @param args 标识外部传递参数
     * @param instrumentation 插桩对象
     */
    public static void premain(String args, Instrumentation instrumentation) {
        // 创建AgentBuilder对象
        AgentBuilder builder = new AgentBuilder.Default()
                // 忽略拦截的包
                .ignore(ElementMatchers.nameStartsWith("net.bytebuddy")
                        .or(ElementMatchers.nameStartsWith("org.apache"))
                )
                // 拦截标注以什么注解的类
                .type(named(PREPARED_STATEMENT_NAME))
                // 前面的type()方法匹配到的类，进行拦截
                .transform(new MySqlTransform())
                .with(new MySqlListener());

        // 安装
        builder.installOn(instrumentation);
    }

}
